package com.gimi.cloud.bbp.commonService.ueditor;

import com.baidu.ueditor.define.ActionMap;
import com.baidu.ueditor.define.AppInfo;
import com.baidu.ueditor.define.BaseState;
import com.baidu.ueditor.define.State;

import javax.servlet.http.HttpServletRequest;
import java.util.Map;

public class JimiActionEnter{

private HttpServletRequest request = null;
	
	private String rootPath = null;
	private String contextPath = null;
	
	private String actionType = null;
	
	private JimiConfigManager configManager = null;
	
	private UeditorUpload target;

	public JimiActionEnter ( HttpServletRequest request, String rootPath,String configFileName, String contextPath, UeditorUpload target) {
		if(rootPath==null || "".equals(rootPath)){
			rootPath = "ueditor/";
		}
		if(configFileName==null || "".equals(configFileName)){
			configFileName = "config.json";
		}
		this.request = request;
		//this.rootPath = rootPath;
		this.rootPath = rootPath+configFileName;
		this.actionType = request.getParameter( "action" );
		this.contextPath = null!=contextPath?contextPath:request.getContextPath();
		//this.configManager = ConfigManager.getInstance( this.rootPath, this.contextPath, request.getRequestURI() );
		//this.configManager = JimiConfigManager.getInstance( this.rootPath, this.contextPath, "");
		this.configManager = new JimiConfigManager( this.rootPath, configFileName, this.contextPath, "");
		this.target = target;
		
	}

	public String exec () {

		String callbackName = this.request.getParameter("callback");

		if ( callbackName != null ) {

			if ( !validCallbackName( callbackName ) ) {
				return new BaseState( false, AppInfo.ILLEGAL ).toJSONString();
			}

			return callbackName+"("+this.invoke()+");";

		} else {
			return this.invoke();
		}

	}
	

	public String invoke(){
		if ( actionType == null || !ActionMap.mapping.containsKey( actionType ) ) {
			return new BaseState( false, AppInfo.INVALID_ACTION ).toJSONString();
		}
		
		if ( this.configManager == null || !this.configManager.valid() ) {
			return new BaseState( false, AppInfo.CONFIG_ERROR ).toJSONString();
		}
		
		State state = null;
		
		int actionCode = ActionMap.getType( this.actionType );
		
		Map<String, Object> conf = null;
		
		switch ( actionCode ) {
		
			case ActionMap.CONFIG:
				return this.configManager.getAllConfig().toString();
			case ActionMap.UPLOAD_IMAGE:
			case ActionMap.UPLOAD_SCRAWL:
			case ActionMap.UPLOAD_VIDEO:
			case ActionMap.UPLOAD_FILE:
				conf = this.configManager.getConfig( actionCode );
//				state = new Uploader( request, conf ).doExec();
				state = target.uploadImage(request,actionType,conf);
				break;
				
			case ActionMap.CATCH_IMAGE:
				conf = configManager.getConfig( actionCode );
//				String[] list = this.request.getParameterValues( (String)conf.get( "fieldName" ) );
//				state = new ImageHunter( conf ).capture( list );
				state = target.catchImage(request,actionType,conf);
				break;
				
			case ActionMap.LIST_IMAGE:
			case ActionMap.LIST_FILE:
				conf = configManager.getConfig( actionCode );
//				int start = this.getStartIndex();
//				state = new FileManager( conf ).listFile( start );
				conf.put("start",request.getParameter("start"));
				conf.put("size",request.getParameter("size"));
				state = target.listImage(request,actionType,conf);
				break;
				
		}
		
		return state.toJSONString();
	}

	public int getStartIndex () {

		String start = this.request.getParameter( "start" );

		try {
			return Integer.parseInt( start );
		} catch ( Exception e ) {
			return 0;
		}

	}

	/**
	 * callback参数验证
	 */
	public boolean validCallbackName ( String name ) {

		if ( name.matches( "^[a-zA-Z_]+[\\w0-9_]*$" ) ) {
			return true;
		}

		return false;

	}
}
